package com.neuronbit.businessflow.runtime.lifecycle;

import com.neuronbit.businessflow.runtime.Flow;
import com.neuronbit.businessflow.runtime.FlowContext;
import com.neuronbit.businessflow.runtime.Step;

/**
 * The interface Step lifecycle hook.
 */
public interface StepLifecycleHook {
    /**
     * Support boolean.
     *
     * @param context the context
     * @param flow    the flow
     * @param step    the step
     * @return the boolean
     */
    boolean support(FlowContext context, Flow flow, Step<?> step);

    /**
     * 更新 step 执行记录：状态=执行完成，输出，执行后的 context，执行耗时
     *
     * @param context the context
     * @param flow    the flow
     * @param tStep   the t step
     */
     void onEnd(FlowContext context, Flow flow, Step tStep);

    /**
     * 更新 step 执行记录：状态=执行失败，异常信息，异常堆栈，执行耗时，累加执行次数
     *
     * @param context the context
     * @param flow    the flow
     * @param tStep   the t step
     * @param e       the e
     */
     void onError(FlowContext context, Flow flow, Step tStep, Exception e);

    /**
     * 判断是否有 step 的执行记录，如果无，则insert 执行记录（包括：执行前context，输入），状态为开始执行，如果有则：
     * 判断flow 是否可重入，如果可重入则判断当前 step 是否已经执行成功，
     * 如果执行失败，则判断 flow是否需要重试执行失败的 step，
     * 如果需要重试则重新拉起 step。否则返回上一次执行失败的结果。
     *
     * @param context the context
     * @param flow    the flow
     * @param tStep   the t step
     */
     void onStart(FlowContext context, Flow flow, Step tStep);

    /**
     * On skipped.
     *
     * @param context the context
     * @param flow    the flow
     * @param tStep   the t step
     */
     void onSkipped(FlowContext context, Flow flow, Step tStep);

    void onPause(FlowContext context, Flow flow, Step tStep);
}
